/**
 * @file bsp_adc.h
 * @brief ADC封装驱动
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-10-17
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __BSP_ADC_V2_H
#define __BSP_ADC_V2_H
#include <stdint.h>
#include <stdbool.h>
#include "bsp.h"
#include "bsp_gpio.h"


/**
 * @brief ADC对象结构体
 */
typedef struct Adc_s
{
    Gpio_t AdcPin;      ///< ADC引脚
    uint8_t channel;    ///< ADC通道号
    bool IsInitialized; ///< ADC通道初始化状态
} Adc_t;

/**
 * @brief ADC初始化
 */
void AdcInit( void );

/**
 * @brief ADC去初始化
 */
void AdcDeInit( void );

/**
 * @brief adc通道初始化
 * @param[in]  obj      adc对象
 * @param[in]  adcInput adc引脚
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 * - @ref BSP_ERROR_ALREADY_INIT - 已初始化，重新初始化先调用 AdcDeInitChannel
 * - @ref BSP_ERROR_NOT_SUPPORTED - 引脚不支持ADC
 */
int8_t AdcInitChannel( Adc_t *obj, PinNames adcInput );

/**
 * @brief adc通道去初始化
 * @param  obj          adc对象
 */
void AdcDeInitChannel(Adc_t *obj);

/**
 * @brief 读取ADC通道AD值
 * @param  obj          adc对象
 * @return uint16_t AD值
 */
uint16_t AdcReadChannel( Adc_t *obj );

/**
 * @brief 均值法ADC采集
 * @param  obj          adc对象
 * @param  times        均值采集次数
 * @return uint16_t AD值
 */
uint16_t AdcReadChannelAverage( Adc_t *obj, uint8_t times );

/**
 * @brief 读取ADC通道电压值
 * @param[in]  obj          adc对象
 * @return float 电压值（0~3.3V）
 */
float AdcReadChannelVol( Adc_t *obj );

#if ADC_TempSensor_EN
/**
 * @brief 获取内部温度传感器温度值
 * @return uint16_t 温度值(扩大了100倍,单位:℃)
 */
uint16_t AdcGetTemp( void );
#endif

#endif	 // __BSP_ADC_V2_H 

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
